// 字面量方式定义
// function () {}
var obj = {
  a: 1,
  b: 2
}

// Object.create()
// var obj2 = Object.create({
//   c: 3,
//   d: 4
// })
// console.log(obj2)

// var obj3 = Object.create(null)
// obj3.a = 1
// obj3.b = 2
// console.log(obj3)


// Object.defineProperty

// var obj3 = {};

// Object.defineProperty(obj3, 'a', {
//   get: function () {
//     console.log('I am the A')
//     // this -> obj
//     console.log('get', this)
//     return 4;
//   },
//   set: function(newVal) {
//     console.log(newVal)
//     console.log('set', this)
//   }
// })

// obj3.a;



function Test() {
  /**
   * new 的过程
   * 
   * this -> {}
   * { a: 1 }
   * { a: 1, b: 2}
   * 
   * return this;
   */
  // this.a = 1; // 执行阶段这些代码都会执行
  // this.b = 2; // 只是在最后一步中返回手动返回的值，以上执行的就会忽略掉
  // console.log(this) // 函数执行 返回一个对象


  // return this;
  return {
    c: 3,
    d: 4
  }
}

/**
 * 1. 构造函数里默认隐式返回this 或者手动返回this
 * 这个this指向的新对象构造都是成功的
 * 2. 如果手动返回了一个新对象 this指向的新对象的构造是失败的(忽略了)
 */

// this -> 实例化出来的对象
new Test(); // -> { a: 1, b: 2}

var test = new Test();
var test2 = Test();
console.log(test); // {c: 3, d: 4}
console.log(test2); // {c: 3, d: 4}